# 1.使用pytorch，完成异或代码处理（每题10分）
# (1)数据处理
# ①创建异或数据集
import matplotlib.pyplot as plt
import torch

x_data = [[0, 0], [0, 1], [1, 0], [1, 1]]
y_data = [0, 1, 1, 0]
# ②设置随机种子
torch.manual_seed(666)
# ③将x，y传入tensor
x = torch.tensor(x_data, dtype=torch.float)
y = torch.tensor(y_data, dtype=torch.float).reshape(-1, 1)
print(x.shape)
print(y.shape)
# ④迭代次数设为10000，学习率为0.1
# (2)模型处理
# ①创建带有1个隐藏层的神经网络，隐藏层神经元个数为3
model = torch.nn.Sequential(
    torch.nn.Linear(in_features=2, out_features=3),
    torch.nn.Sigmoid(),
    torch.nn.Linear(in_features=3, out_features=1),
    torch.nn.Sigmoid()
)
loss_fn = torch.nn.BCELoss()
op = torch.optim.Adam(params=model.parameters(), lr=0.1)
# ②激活函数使用sigmoid，创建并编译
# ③使用梯度下降处理模型
# ④代价函数使用pytorch底层完成
# ⑤每100次打印代价值和准确率
# ⑥绘制代价值变化曲线
loss_list = []
for i in range(10000):
    op.zero_grad()
    h = model(x)
    loss = loss_fn(h, y)
    loss.backward()
    op.step()
    loss_list.append(loss.data.numpy())
    if i % 100 == 0:
        y_predict = (h > 0.5).int()
        acc = (y_predict == y).float().mean().numpy()
        print(i, loss.data.numpy(), acc)
plt.plot(loss_list)
plt.show()
